package com.usdt.generator.util;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MyBatisPlusGenerator {
    public static void main(String[] args) {
        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
                "jdbc:mysql://rm-uf65hd13amkme17cxmo.mysql.rds.aliyuncs.com:3306/kangyang_oms",
                "kangyang_oms",
                "KangyangOms!2025")
                .build();

        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig.Builder()
                .outputDir(System.getProperty("user.dir") + "/src/main/java")
                .author("L")
                //.openDir(false)
                .build();

     // 包配置
        PackageConfig packageConfig = new PackageConfig.Builder()
                .parent("com.usdt")
                .moduleName("generator")
                .entity("auto")
                .mapper("auto")
                .service("auto")
                .serviceImpl("auto")
                .controller("auto")
                .pathInfo(Collections.singletonMap(
                    OutputFile.xml, 
                    System.getProperty("user.dir") + "/src/main/resources/mapper"
                ))
                .build();

        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig.Builder()
                .addInclude("s_callback_record") // 要生成的表名
                .addTablePrefix("s_", "t_") // 同时去除s_和t_前缀
                .entityBuilder()
                .formatFileName("%sEntity") // %s会被替换为原始实体名
                .enableLombok()
                .naming(NamingStrategy.underline_to_camel)
                .columnNaming(NamingStrategy.underline_to_camel)
                .mapperBuilder()
                .enableMapperAnnotation()
                .enableBaseResultMap()
                .enableBaseColumnList()
                .serviceBuilder()
                .formatServiceFileName("%sService") // 服务接口命名规则 I%sService-->IUserService
                .formatServiceImplFileName("%sServiceImpl") // 可选：自定义实现类命名
                .controllerBuilder()
                .enableRestStyle()
                .enableHyphenStyle() // 使用驼峰转连字符
                .build();
        
        // 自定义文件配置
		/*生成 DTO（数据传输对象）
		生成 VO（视图对象）
		生成自定义的 Service 接口或实现类
		生成其他与实体相关的辅助类*/
        List<CustomFile> customFiles = new ArrayList<>();
		/*customFiles.add(new CustomFile.Builder()
		        .fileName("CustomDTO.java")
		        .templatePath("/templates/custom-dto.java.ftl")
		        .packageName("com.example.dto")
		        .build());*/

        // 注入配置
        InjectionConfig injectionConfig = new InjectionConfig.Builder()
                .customFile(customFiles)
                .build();

        // 模板配置（可选）
		/*TemplateConfig templateConfig = new TemplateConfig.Builder()
		        .disable(TemplateType.ENTITY) // 禁用默认实体生成（如果需要自定义）
		        .build();*/
     // 模板配置（使用默认模板，不自定义）
        TemplateConfig templateConfig = new TemplateConfig.Builder().build();

     // 执行生成
        new AutoGenerator(dataSourceConfig)
        		.global(globalConfig)
        		.packageInfo(packageConfig)
        		.strategy(strategyConfig)
        		.template(templateConfig)
        		.injection(injectionConfig)
        		.execute();
        
		/*new AutoGenerator().
				.setDataSource(dataSourceConfig)
		        .setGlobalConfig(globalConfig)
		        .setPackageInfo(packageConfig)
		        .setStrategy(strategyConfig)
		        .setTemplate(templateConfig)
		        .setCfg(injectionConfig) // 关键：使用 setCfg 注入自定义配置
		        .execute();*/
    }
    
    public static void main2(String[] args) {
    	FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "password")
        .globalConfig(builder -> {
            builder.author("author") // 设置作者
                .outputDir("src/main/java"); // 指定输出目录
        })
        .packageConfig(builder -> {
            builder.parent("com.example") // 设置父包名
                .moduleName("system") // 设置模块名
                .pathInfo(Collections.singletonMap(OutputFile.xml, "src/main/resources/mapper")); 
        })
        .strategyConfig(builder -> {
            builder.addInclude("t_user") // 设置需要生成的表名
                .addTablePrefix("t_") // 设置过滤表前缀
                .entityBuilder()
                .enableLombok()
                .controllerBuilder()
                .enableRestStyle();
        })
        .execute();
    }
}